package controller

import (
	"bj38web/web/utils"
	"context"
	"encoding/json"
	"fmt"
	"image/png"
	"net/http"

	"github.com/afocus/captcha"
	openapi "github.com/alibabacloud-go/darabonba-openapi/v2/client"
	"github.com/alibabacloud-go/tea/tea"
	credential "github.com/aliyun/credentials-go/credentials"
	"github.com/gin-gonic/gin"
	"github.com/go-micro/plugins/v4/registry/consul"

	"go-micro.dev/v4"

	getCaptcha "bj38web/web/proto/getCaptcha"
	useMicro "bj38web/web/proto/user"
)

// Description:
//
// 使用凭据初始化账号Client
//
// @return Client
//
// @throws Exception
// 短信
func CreateClient() (_result *openapi.Client, _err error) {
	// 工程代码建议使用更安全的无AK方式，凭据配置方式请参见：https://help.aliyun.com/document_detail/378661.html。
	credential, _err := credential.NewCredential(nil)
	if _err != nil {
		return _result, _err
	}

	config := &openapi.Config{
		Credential: credential,
	}
	// Endpoint 请参考 https://api.aliyun.com/product/Dysmsapi
	config.Endpoint = tea.String("dysmsapi.aliyuncs.com")
	_result = &openapi.Client{}
	_result, _err = openapi.NewClient(config)
	return _result, _err
}

// Description:
//
// # API 相关
//
// @param path - string Path parameters
//
// @return OpenApi.Params
func CreateApiInfo() (_result *openapi.Params) {
	params := &openapi.Params{
		// 接口名称
		Action: tea.String("SendSms"),
		// 接口版本
		Version: tea.String("2017-05-25"),
		// 接口协议
		Protocol: tea.String("HTTPS"),
		// 接口 HTTP 方法
		Method:   tea.String("POST"),
		AuthType: tea.String("AK"),
		Style:    tea.String("RPC"),
		// 接口 PATH
		Pathname: tea.String("/"),
		// 接口请求体内容格式
		ReqBodyType: tea.String("json"),
		// 接口响应体内容格式
		BodyType: tea.String("json"),
	}
	_result = params
	return _result
}

// 获取session信息
func GetSession(ctx *gin.Context) {
	//初始化错误返回发map
	resp := make(map[string]string)
	resp["errno"] = utils.RECODE_SESSIONERR
	resp["errmsg"] = utils.RecodeText(utils.RECODE_SESSIONERR)

	ctx.JSON(http.StatusOK, resp)
}

// 获取图片信息
func GetImageCd(ctx *gin.Context) {
	//获取图片验证码的UUID
	uuid := ctx.Param("uuid")
	//指定consul服务发现
	consulReg := consul.NewRegistry()
	consulService := micro.NewService(
		micro.Registry(consulReg),
	)
	//初始化客户端
	microClient := getCaptcha.NewGetCaptchaService("getcaptcha", consulService.Client())
	//调用远程函数
	resp, err := microClient.Call(context.TODO(), &getCaptcha.CallRequest{Uuid: uuid})
	if err != nil {
		fmt.Println("未找到远程服务....")
		return
	}
	//将得到的数据反序列化，得到图片数据
	var img captcha.Image
	json.Unmarshal(resp.Img, &img)
	//将图片写出到浏览器
	png.Encode(ctx.Writer, img)

	fmt.Println("uuid=", uuid)
}

// 获取短信验证码信息
func GetSmscd(ctx *gin.Context) {
	//获取短信验证码
	phone := ctx.Param("phone")
	//拆分GET请求中的URL===格式：资源路径?k=v&k=v&k=v
	imgCode := ctx.Query("text")
	uuid := ctx.Query("id")

	//创建容器
	//resp := make(map[string]string)
	//fmt.Println("phone=", phone, "code=", imgCode, "uuid=", uuid)
	///////////////////调用微服务////////////////////
	//指定consul服务发现
	consulReg := consul.NewRegistry()
	consulService := micro.NewService(
		micro.Registry(consulReg),
	)
	//初始化客户端
	microClient := useMicro.NewUserService("user", consulService.Client())
	//调用远程函数
	resp, err := microClient.SendSms(context.TODO(), &useMicro.Request{Phone: phone, ImgCode: imgCode, Uuid: uuid})
	if err != nil {
		fmt.Println("调用远程函数SendSms函数失败", err)
		return
	}
	//发送结果
	ctx.JSON(http.StatusOK, resp)
}

// 发送注册信息
func PostRet(ctx *gin.Context) {
	/*  mobile := ctx.PostForm("mobile")
	    pwd := ctx.PostForm("password")
	    sms_code := ctx.PostForm("sms_code")
	    fmt.Println("m = ", mobile, "pwd = ", pwd, "sms_code = ",sms_code)
	*/
	// 获取数据
	var regData struct {
		Mobile   string `json:"mobile"`
		PassWord string `json:"password"`
		SmsCode  string `json:"sms_code"`
	}
	ctx.Bind(&regData)
	fmt.Println("获取到的数据为:", regData)
}
